// CFF - Contract Folder Filter
// Eine Erweiterung für 'Kapi Hospital © upjers GmbH und Co. KG'
// Version 1.1
// 7. Mai 2012
    
var tinysort = {
    // Welche Liste wird gerade angezeigt
    inc_out_schalter: "referral_send",
    // speichert die Sortierung für gesendete Patienten (Spalte und Richtung)
    referral_send_sorted: "",
    referral_send_sorted_dir: "",
    // speichert die Sortierung für empfangene Patienten (Spalte und Richtung)
    referral_reci_sorted: "",
    referral_reci_sorted_dir: "",

    // Raumfilter für versendete Patienten
    referral_send_current_filter_index: "",
    // Raumfilter für empfangene Patienten
    referral_reci_current_filter_index: "",
    // Nach welcher Krankheit wurde zuletzt gefiltert
    referral_send_current_kh_filter: "",
    referral_reci_current_kh_filter: "",
    // Ein paar Lookup-Arrays, Räume, und Räume, Farben und IDs der Krankheiten
    raum_abk: ["Beh.","Rön.","Ult.","Ort.","Psy.","Ekg.","Ope.","Lab.","Dun.","Gum.","Tom.","Tro.","Nuk.","Zah."],
    rraeume: ["br", "rr", "ur", "or", "pt", "ekg", "op", "lab", "dk", "gum", "tom", "tro", "nuk", "zm"],
    raumliste: {
        "br": ["e2bd9b", 4, 3, 6, 5, 12, 11, 10],					"rr": ["a3a6de", 1, 2, 18, 58, 73],
        "ur": ["b48dc4", 26, 44, 30, 113, 94, 99, 52, 75],			"or": ["e0e19a", 48, 66, 49, 80, 103, 110, 55, 60],
        "pt": ["74b077", 8, 9, 34, 88, 96, 27, 33, 108, 50],		"ekg": ["bce3b3", 71, 67, 79, 37, 83, 100, 41, 46],
        "op": ["d9d9d9", 19, 39, 77, 107, 40, 101, 53, 65],			"lab": ["ffffff", 61, 21, 86, 22, 98, 38, 105, 43, 74],
        "dk": ["666468", 36, 45, 78, 84, 56, 90, 111, 20, 32, 76],	"gum": ["556c7c", 35, 31, 82, 93, 95, 57, 24, 64],
        "tom": ["dcc6a1", 29, 16, 91, 13, 97, 106, 63, 72],			"tro": ["707b58", 51, 15, 87, 7, 104, 14, 114, 47, 17],
		"nuk": ["a296a3", 69, 54, 23, 81, 112, 92, 42, 109, 59],	"zm": ["a5dbdf", 68, 28, 85, 102, 89, 62, 70]
    },

    switch_view: function() {
        var switch_row;
        
        // Hier wird einfach zwischen den beiden Listen umgeschaltet
        switch (tinysort.inc_out_schalter) {
        case "referral_send":
            jQuery("#referral_send").hide();
            jQuery("#referral_reci").show();
            jQuery("#schalter").text("ankommende Patienten").css("background", "#7fc1c1");
            tinysort.inc_out_schalter = "referral_reci";
            switch_row = tinysort[tinysort.inc_out_schalter + "_current_filter_index"];
            tinysort.show_filterrow(switch_row);
            break;
        case "referral_reci":
            jQuery("#referral_reci").hide();
            jQuery("#referral_send").show();
            jQuery("#schalter").text("überwiesene Patienten").css("background", "#df9355");
            tinysort.inc_out_schalter = "referral_send";
            switch_row = tinysort[tinysort.inc_out_schalter + "_current_filter_index"];
            tinysort.show_filterrow(switch_row);
            break;
        default:
            return;
            break;
        }
    },


    init_tinysort: function() {
		var mappe, check, last_tab, send_sorted, send_sorted_dir, reci_sorted,
			reci_sorted_dir, raum_filter, kh_filter;
		
        // Wir brauchen nix zu versuchen, wenn das Einbinden von jQuery nicht geklappt hat
        if (typeof jQuery == 'undefined') return;
        // Erst wenn die Mappe aufgerufen wird, ist das Element #referrals vorhanden 
        check = document.getElementById("referrals");
        // Wenn es nicht da ist, nix machen (das ist für die Intervallfunktion)
        if (!check) return;
        // init_tinysort sol außerdem nur einmal (pro Mappenaufruf) laufen.
        if (check.ts_2976) return;
        else check.ts_2976 = true;

        // Wenn versendete Patienten vorhanden sind, Spalten zum sortieren vorbereiten
        if (jQuery("#referral_send div").length > 2) {
            jQuery("#referral_send > div").slice(1, 5).css({
                "cursor": "hand",
                "cursor": "pointer"
            }).on("click",
            function() {
                tinysort.init_sort(this.textContent.replace(/^\s*/, '').replace(/\s*$/, ''), "asc");
            }); // end [.on]function
        }
        // das gleiche für empfangene Patienten
        if (jQuery("#referral_reci div").length > 2) {
            jQuery("#referral_reci > div").slice(1, 5).css({
                "cursor": "hand",
                "cursor": "pointer"
            }).on("click",
            function() {
                tinysort.init_sort(this.textContent.replace(/^\s*/, '').replace(/\s*$/, ''), "asc");
            });
        }

        // Hiermit werden die Filter in die Mappe eingefügt (und etwas darin aufgeräumt)
        tinysort.init_filter();
        
        // Alle Sortierungen und Filter die zuletzt gemacht wurden, sind gespeichert
        // und müssen erneut durchgeführt werden.
        // Sortierungen
        last_tab = tinysort.inc_out_schalter;
        
        if ( send_sorted = tinysort.referral_send_sorted || "" !== "") {
        
        	// Temporär wird der Schalter auf referral_send gesetzt
        	tinysort.inc_out_schalter = "referral_send";
        
            tinysort.referral_send_sorted = "";
            send_sorted_dir = tinysort.referral_send_sorted_dir || "";
            tinysort.referral_send_sorted_dir = "";
            tinysort.init_sort(send_sorted, send_sorted_dir);
        }
        if ( reci_sorted = tinysort.referral_reci_sorted || "" !== "") {
        
        	// Temporär wird der Schalter auf referral_reci gesetzt
        	tinysort.inc_out_schalter = "referral_reci";
        	
            tinysort.referral_reci_sorted = "";
            reci_sorted_dir = tinysort.referral_reci_sorted_dir || "";
            tinysort.referral_reci_sorted_dir = "";
            tinysort.init_sort(reci_sorted, reci_sorted_dir);
        }        

        // Filter
        
        if ( raum_filter = tinysort.referral_send_current_filter_index || "" !== "" ) {
        	
        	// Temporär wird der Schalter auf referral_send gesetzt
        	tinysort.inc_out_schalter = "referral_send";
        	
			if ( kh_filter = tinysort.referral_send_current_kh_filter || "" !== "" ) {
				tinysort.filter_list(kh_filter);
			} else {
				tinysort.filter_room(raum_filter);
			}
			if ( last_tab == "referral_send" ) tinysort.show_filterrow(raum_filter);
		}
		if ( raum_filter = tinysort.referral_reci_current_filter_index || "" !== "" ) {
			
			// Temporär wird der Schalter auf referral_reci gesetzt
			tinysort.inc_out_schalter = "referral_reci";
			
			if ( kh_filter = tinysort.referral_reci_current_kh_filter || "" !== "" ) {
				tinysort.filter_list(kh_filter);	
			} else {
				tinysort.filter_room(raum_filter);
			}
			if ( last_tab == "referral_reci" ) tinysort.show_filterrow(raum_filter);
		}
		
		// 
		tinysort.inc_out_schalter = last_tab;


    },

    init_filter: function() {
		var wrapper, table, row, zelle, br, rr, ur, or, pt, ek,
			op, la, dk, gu, to, tr, nu, zm, x, i, l;
		var test;
		var test2;

        // erstmal aufraeumen
        jQuery("#referral_reci_head").remove();
        jQuery("#referral_send_head").remove();
        jQuery("#referrals > br").remove();

        // beim ersten Aufruf wird die reci-Liste versteckt, sonst die zuletzt inaktive
        (tinysort.inc_out_schalter == "referral_send") ? jQuery("#referral_reci").hide() : jQuery("#referral_send").hide();


        // ganz unten wird ein Schalter als DIV eingefügt, der zwischen den Listen umschaltet
        wrapper = jQuery("<div>");
        wrapper.css({
            "position": "absolute",
            "width": "535px",
            "background-color": "#df9355",
            "height": "15px",
            "border": "1px solid black",
            "text-align": "center",
            "line-height": "15px",
            "cursor": "hand",
            "cursor": "pointer",
            "left": "30px",
            "bottom": "50px"
        });
        wrapper.attr("id", "schalter");
        wrapper.text("überwiesene Patienten");

        // der Schalter wird unten in der Mappe eingefügt und ist so immer sichtbar
        jQuery("#referrals").after(wrapper);

        // und der Eventlistener generiert, ein Klick schaltet um
        jQuery("#schalter").on("click",
        function() {
            tinysort.switch_view();
        });

        // Hier werden die Filterboxen erstellt, ein DIV-Wrapper und eine Tabelle
        // für alle Räume und einen Button zum resetten der Filter
        wrapper = jQuery("<div>");
        wrapper.attr("id", "filtertable");
        wrapper.css({
            "width": "535",
            "height": "20px",
            "position": "absolute",
            "overflow": "hidden",
            "background": "#444444",
            "top": "50px",
            "left": "30px",
            "z-index": "9"
        });
        table = jQuery("<table>").css({"width": "100%","text-align": "center","height": "15px","margin": "0","border": "1px solid black"});
        row = jQuery("<tr>").css({"cursor": "hand","cursor": "pointer"});
				
		for ( i = 0 , l = tinysort.raum_abk.length ; i < l ; i += 1 ) {
			zelle = jQuery("<td>").text(tinysort.raum_abk[i]).css({"width": "35","background-color": "#" + tinysort.raumliste[tinysort.rraeume[i]][0]});
			row.append(zelle);
		}

        wrapper.append(table.append(row));

        // Die Filter werden oben in der Mappe eingefügt, ebenfalls immer sichtbar ...
        jQuery("#schalter").after(wrapper);

        // ... und die Eventlistener erstellt, ein Klick zeigt KH-Filter für den Raum
        // und filtert auch gleich die aktuelle Liste nach Raum
        jQuery("#filtertable td").each(function() {
            jQuery(this).on("click",
            function() {
                tinysort.show_filterrow(this.cellIndex);
                tinysort.filter_room(this.cellIndex);
            });
        });

        // Das ist der Reset-Button, nachträglich weil anderes Event
        x = jQuery("<td>").text("X").css({
            "width": "35",
            "background-color": "#ff0000"
        }).on("click", tinysort.remove_filter);
        // und anhängen an die Tabellenzeile
        jQuery("#filtertable tr").append(x);

        // Hier werden die KH-Filter erstellt. Weils einfacher ist eine kleine Tabelle für jeden Raum
        wrapper = jQuery("<div>");
        wrapper.attr("id", "kh_filter");
        wrapper.css({
	        "width": "535",
	        "height": "17px",
	        "position": "absolute",
	        "top": "72px",
	        "left": "30px",
	        "z-index": "8",
	        "text-align": "center"
        });
        for (i = 0, l = tinysort.rraeume.length; i < l; i++) {
        	ll = tinysort.raumliste[tinysort.rraeume[i]].length
            table = jQuery("<table>");
            // Alle Tabellen werden unsichtbar erstellt
            table.css({
	            "display": "none",
	            "margin": "1px auto"
            });
            row = jQuery("<tr>");
            for (j = 1; j < ll; j++) {
                zelle = jQuery("<td>").on("click", tinysort.filter_list);
                zelle.attr("id", "f_" + tinysort.raumliste[tinysort.rraeume[i]][j]);
                zelle.attr("class", "d_a_15 d_" + tinysort.raumliste[tinysort.rraeume[i]][j] + "_15");
                zelle.css({
					"margin-left": "2px",
					"padding":"0px",
	                "width": "15px",
	                "height": "15px",
	                "cursor": "hand",
	                "cursor": "pointer"
	                });
                row.append(zelle);
            }
            table.append(row);
            wrapper.append(table);
        }
        // einfügen des Wrappers nach den Raumfiltern
        jQuery("#filtertable").after(wrapper);

    },

    remove_filter: function() {
    	var patients, i, l, ind; 
    	
        patients = document.getElementById(tinysort.inc_out_schalter).children;

        // Alle Patienten sichtbar
        for (i = 5, l = patients.length; i < l; i++) {
            patients[i].style.display = "";
        }

        // Da aktuell kein Filter gewählt ist, ausblenden und vermerken
        ind = tinysort[tinysort.inc_out_schalter + "_current_filter_index"];
        jQuery("#kh_filter table").slice(ind, ind + 1).fadeOut(200);
        tinysort[tinysort.inc_out_schalter + "_current_filter_index"] = "";
        tinysort[tinysort.inc_out_schalter + "_current_kh_filter"] = "";
    },

    filter_list: function(kh) {
    	var patients, to_filter_for, i, l, searchstring, found;

        // wir wollen immer nur die Liste filtern die gerade aktiv ist
        patients = document.getElementById(tinysort.inc_out_schalter).children;
        if (this.id) {
            tinysort[tinysort.inc_out_schalter + "_current_kh_filter"] = this.id;
            to_filter_for = "d_" + this.id.replace("f_", "") + "_15";
        } else if(kh) {
			to_filter_for = kh.replace("f_", "") + "_15";
		}
		
        for (i = 5, l = patients.length; i < l; i++) {
            searchstring = patients[i].innerHTML.toString();
            found = searchstring.split(to_filter_for).length;
            if (found == 2) patients[i].style.display = "";
            else patients[i].style.display = "none";
        }

    },

    filter_room: function(ind) {
    	var patients, i, j, l, ll, searchstring, found; 
    
        patients = document.getElementById(tinysort.inc_out_schalter).children;

        for (i = 5, l = patients.length; i < l; i++) {
            searchstring = patients[i].innerHTML.toString();
            ll = tinysort.raumliste[tinysort.rraeume[ind]].length;
            found = false;
            for (j = 0; j < ll; j++) {   
                if (searchstring.search("d_" + tinysort.raumliste[tinysort.rraeume[ind]][j] + "_15") != -1) {
                    patients[i].style.display = "";
                    found = true;
                    break;
                }

            }
            if (!found) {
                patients[i].style.display = "none";
            }
        }
        tinysort[tinysort.inc_out_schalter + "_current_filter_index"] = ind;
    },

    show_filterrow: function(ind) {

        // wenn index übergeben wurde dann diesen als neuen verwenden
        // sonst den Zellindex des gelieferten DOM Objekts verwenden und als neuen setzen
		ind = parseInt(ind,10);
        if (this.cellIndex) {
            tinysort[tinysort.inc_out_schalter + "_current_filter_index"] = this.cellIndex;
        } else if ( ind >= 0 ) {
            tinysort[tinysort.inc_out_schalter + "_current_filter_index"] = ind;
        } else {
            jQuery("#kh_filter").animate({
                top: "-=22"
            },
            200,
            function() {
                jQuery("#kh_filter table").each(function() {
                    jQuery(this).hide();
                });
            });
            jQuery("#kh_filter").animate({
                top: "+=22"
            },
            200);
            return;
        }

        // Hier ist eine kleine Animation eingebaut (wo jQuery schonmal da ist)
        // Die neuen Filter für Krankheiten werden hier angezeigt, und danach nach Raum gefiltert
        jQuery("#kh_filter").animate({
            top: "-=22"
        },
        200,
        function() {
            jQuery("#kh_filter table").each(function() {
                jQuery(this).hide();
            });
            ind = tinysort[tinysort.inc_out_schalter + "_current_filter_index"];
            jQuery("#kh_filter table").slice(ind, ind + 1).show();
        });
        jQuery("#kh_filter").animate({
            top: "+=22"
        },
        200);
    },

    sort_out: function(patient_map, dir) {
    	var ref_list, i, l;
    	
        ref_list = document.getElementById(tinysort.inc_out_schalter);
        
        // Abhängig von dir aufsteigend oder absteigend sortieren ...
        dir == "asc" || dir == "" ? patient_map.sort(function(a, b) {
            return (a[1] > b[1] ? 1: a[1] < b[1] ? -1: 0);
        }) : patient_map.sort(function(a, b) {
            return (a[1] < b[1] ? 1: a[1] > b[1] ? -1: 0);
        });

		// ... und anhängen
        for (i = 0, l = patient_map.length; i < l; i++) {
            ref_list.appendChild(patient_map[i][0]);
        }

    },

    reverse_sort: function() {
    	var ref_list, i;
    	
        ref_list = document.getElementById(tinysort.inc_out_schalter);
        
        // 2. letzter bis erster Patient hinten anhängen -> Reihenfolge umgekehrt ...
        for (i = ref_list.children.length - 2; i > 4; i--) {
            ref_list.appendChild(ref_list.children[i]);
        }
        
        // ... und wir tauschen einfach die aktuelle Richtung
        (tinysort[tinysort.inc_out_schalter + "_sorted_dir"] == "asc") ?
        	tinysort[tinysort.inc_out_schalter + "_sorted_dir"] = "des" :
            	tinysort[tinysort.inc_out_schalter + "_sorted_dir"] = "asc";
    },

    init_sort: function(column_header, dir) {
        var i, l, found, patients, patient_map = [];

        dir = dir || "";
        patients = document.getElementById(tinysort.inc_out_schalter).children;

		// Wenn zuvor nach dieser Spalte sortiert wurde, reverse ...
		if (tinysort[tinysort.inc_out_schalter + "_sorted"] == column_header) {
        	tinysort.reverse_sort();
        	return;
        }

		// ... sonst sortieren, Richtung dir
        switch (column_header) {
        case "Patientenname":
			for (i = 5, l = patients.length; i < l; i++) {
                    patient_map[i - 5] = [patients[i], patients[i].children[0].textContent];
            }
            break;

        case "Krankheiten":
            for (i = 5, l = patients.length; i < l; i++) {
                    found = patients[i].innerHTML.toString().split("d_a_15");
                    patient_map[i - 5] = [patients[i], found.length - 1];
            }
            break;

        case "Empfänger":
            for (i = 5, l = patients.length; i < l; i++) {
                patient_map[i - 5] = [patients[i], patients[i].children[2].textContent.toLowerCase()];
            }
            break;

        case "Kosten":
            for (i = 5, l = patients.length; i < l; i++) {
                patient_map[i - 5] = [patients[i], parseFloat(patients[i].children[3].textContent.replace(" hT", "").replace(".", "").replace(",", "."))];
            }
            break;

        default:
            return;
            
        }
        
        // Erst hier wird die Sortieerfunktion aufgerufen, die die gesammelten Daten sortiert ...
        tinysort.sort_out(patient_map, dir);
        
        // ... und die aktuellen Sortierungen werden gespeichert.
        tinysort[tinysort.inc_out_schalter + "_sorted_dir"] = dir;
        tinysort[tinysort.inc_out_schalter + "_sorted"] = column_header;
    }
};